
package com.x52im.rbchat.logic.search.content;

import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.eva.android.ArrayListObservable;
import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.x52im.rainbowchat.http.logic.dto.GroupEntity;
import com.x52im.rbchat.logic.alarm.AlarmsFragment;
import com.x52im.rbchat.logic.search.AbstractSearchActivity;
import com.x52im.rbchat.logic.search.SearchGroupsActivity;
import com.x52im.rbchat.logic.search.model.GroupContentDTO;
import com.x52im.rbchat.logic.search.viewholder.GroupViewHolder;

import java.util.ArrayList;
import java.util.List;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;

/**
 * 群聊可搜索内容实现类。
 * <p>
 * 该类是为了拆解并分散搜索功能的复杂性，同时提高不同搜索内容的可重用性等，主要是基于设计模式考虑。
 * <p>
 * 该类将实现搜索逻辑、搜索结果的recycleView里的显示效果、点击事件处理等。
 *
 * @author JackJiang
 * @since 8.2
 */
public class GroupsContent extends SearchableContent<GroupContentDTO, GroupViewHolder> {

    public final static String CATLOG = "群组";

    /**
     * 用于RecycleView的adapter中的onCreateViewHolder方法。
     *
     * @param fragment 对应的fragment对象应用
     * @param parent   对应于列表item的view对象应用
     * @param viewType 列表item的viewType
     * @return 返回对应的ViewHoler对象子类
     */
    @Override
    public GroupViewHolder onCreateViewHolder(Fragment fragment, @NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(fragment.getActivity()).inflate(R.layout.search_result_item_group, parent, false);
        return new GroupViewHolder(fragment, itemView);
    }

    /**
     * 用于RecycleView的adapter中的onBindViewHolder方法。
     *
     * @param fragment          对应的fragment对象应用
     * @param holder            对应的ViewHoler对象子类
     * @param groupContentDTO 搜索结果item对象
     * @param showCatlog        是否显示item上方的标题文本（true表示显示，否则不显示）
     */
    @Override
    public void onBind(Fragment fragment, GroupViewHolder holder, GroupContentDTO groupContentDTO, boolean showCatlog) {
        holder.onBind(currentKeyword, groupContentDTO, showCatlog);
    }

    /**
     * 点击事件真正的实施方法。子类可重写本方法实现自已的逻辑。
     *
     * @param fragment          所在fragment对象引用
     * @param holder            viewHodler对象引用
     * @param view              列表item的view对象引用
     * @param groupContentDTO 搜索结果item对象
     */
    @Override
    public void doClickImpl(Fragment fragment, GroupViewHolder holder, View view, GroupContentDTO groupContentDTO) {
        GroupEntity g = groupContentDTO.getGroupInfo();
        AlarmsFragment.gotoGroupChattingActivity(fragment.getActivity(), g.getG_id(), g, null);
    }

    /**
     * 点击"查看更多"事件真正的实施方法。
     *
     * @param fragment 所在fragment对象引用
     * @param view     列表item的view对象引用
     * @see #doClickMore(Fragment, View)
     */
    public void doClickMoreImpl(Fragment fragment, View view) {
        Intent intent = new Intent(fragment.getActivity(), SearchGroupsActivity.class);
        intent.putExtra(AbstractSearchActivity.INTENT_KEY_KEYWORD, currentKeyword);
        intent.putExtra(AbstractSearchActivity.INTENT_KEY_SHOWALLRESULT, true);
        intent.putExtra(AbstractSearchActivity.INTENT_KEY_AUTOFOCUSSEARCHINPUTVIEW, false);
        fragment.startActivity(intent);
    }

    /**
     * 搜索群聊的实施方法。
     *
     * @param keyword 要搜索的关键词
     * @return 返回的搜索结果集
     */
    @Override
    public List<GroupContentDTO> doSearchImpl(String keyword, boolean searchAll) {
        ArrayList<GroupContentDTO> result = new ArrayList<>();
        // 从好友列表中查找包含关键字的好友信息，并加入到查找结果集合中
        if(keyword != null) {
            // 我的好友列表数据
            ArrayListObservable<GroupEntity> groups = MyApplication.getInstance2()
                    .getIMClientManager().getGroupsProvider().getGroupsListData(null, false);
            if (groups != null && groups.getDataList() != null) {
                for (GroupEntity g : groups.getDataList()) {
                    // 群名称内是否包含关键字
                    if(g != null && g.getG_name() != null && g.getG_name().toLowerCase().contains(keyword.toLowerCase())){
                        result.add(new GroupContentDTO(g, GroupContentDTO.MACHED_TYPE_GNAME));
                    }
                }
            }
        }

        return result;
    }

    /**
     * 返回本搜索内容显示在结果列表界面中时的对应的viewType。
     * 子类重写本方法实现自已的viewType生成逻辑，要求是：本值应大于100（100以内为保留值）、且本值应在显示列表中全局唯一。
     *
     * @return 返回viewType值
     */
    @Override
    public int getViewType() {
        return R.layout.search_result_item_group;
    }

    /**
     * 返回对应搜索内容的标题栏文本内容。
     *
     * @return 返回标题栏文本内容
     */
    @Override
    public String getCategory() {
        return CATLOG;
    }
}
